VBA学习笔记71: Select多表查询 您所在的位置:网站首页 vba的select case VBA学习笔记71: Select多表查询

VBA学习笔记71: Select多表查询

#VBA学习笔记71: Select多表查询| 来源: 网络整理| 查看: 265

学习资源:《Excel VBA从入门到进阶》第73集 by兰色幻想

之前讲的都是单表查询,这节来学习多表查询。

首先做的还是创建类模块,把打开数据库、复制筛选后的数据到单元格区域和关闭数据库的代码,以便后续可直接调用和增加代码可读性。

Sub 执行筛选(sq, Rg As String) 'sq是SQL语句,Rg是搜索结果粘贴的位置 Dim conn As New Connection With ActiveSheet .Range(Rg).Resize(100, 7) = "" conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName .Range(Rg).CopyFromRecordset conn.Execute(sq) End With conn.Close Set conn = Nothing End Sub

下面开始正式内容:

一、多个select查询结果合并

Union all

例1:合并下面两个表格的A-C列。

表1表2Sub 合并工作表数据() Dim data As New 类1 Dim sql As String sql = "select * from [Sheet1$a:c] union all select * from [sheet2$a:c]" data.执行筛选 sql, "a2" End Sub运行结果:就是把两个表接起来了

如果不写union all 中的all呢?

Sub 合并工作表数据2() Dim data As New 类1 Dim sql As String sql = "select * from [Sheet1$a:c] union select * from [sheet2$a:c]" data.执行筛选 sql, "a2" End Sub运行结果,少了两表重复的部分

由此可以看出,all在这里面的作用,是获取查询的全部数据,而不写all,程序会忽略重复数值部分。

这里举例是查询合并两个表格,如果需要合并更多,可以使用循环语句。

那么想获取相同类别的汇总应该怎么做呢?

——利用子查询。

先用union all对表格进行子查询,然后再对子查询进行汇总求和,最后才输出。注意子查询要用括弧和双引号括起来。

Sub 汇总() Dim data As New 类1 Dim sql As String Dim sq As String sql = "select * from [sheet1$a:c] union all select * from [sheet2$a:c]" '子查询 sq = "select 类别,sum(数量),sum(金额) from (" & sql & ") group by 类别" '对子查询进行汇总求和合并 data.执行筛选 sq, "a2" End Sub运行结果,注意看A2\A3\A4类别,数量和金额都合并了

二、查询两个表中相同的字段数据

select……from……where……Select 字段 from 表1,表2 where 表1.字段=表2.字段

例2:合并上列两个表中类别相同的数据。

Sub 列出相同() Dim data As New 类1 Dim sql As String sql = "select [Sheet1$a:c].* from [Sheet1$a:c],[Sheet2$a:c] where [Sheet1$a:c].类别=[Sheet2$a:c].类别" data.执行筛选 sql, "a2" End Sub

2. Join

Join有四种用法:

①JOIN: 如果表中有至少一个匹配,则返回行

②LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

③RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

④FULL JOIN: 只要其中一个表中存在匹配,就返回行,可惜的是在EXCEL VBA中不支持

首先来看看①的使用:

Select 字段 from 表1 Inner Join 表2 on 条件

还是使用上例,where换成Inner Join……on……

Sub 列出相同2() Dim data As New 类1 Dim sql As String sql = "select [Sheet1$].*,[sheet2$].* from [Sheet1$] Inner Join [sheet2$] on [Sheet1$].类别=[sheet2$].类别" data.执行筛选 sql, "a2" End Sub两个表的查询结果并排放一起了。

表二应该写与表一不一样的字段名,不能直接用*通配符匹配全部。

sql = "select [Sheet1$].*,[sheet2$].库别 from [Sheet1$] Inner Join [sheet2$] on [Sheet1$].类别=[sheet2$].类别"运行结果

② LEFT JOIN & RIGHT JOIN

LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

例:接例1

Sub 合并() Dim data As New 类1 Dim sql As String sql = "select [Sheet1$].*,[sheet2$].库别 from [Sheet1$] left Join [sheet2$] on [Sheet1$].类别=[sheet2$].类别" data.执行筛选 sql, "a2" End Sub运行结果,表1中有的类别都显示出来了

改成right join:

sql = "select [Sheet1$].*,[sheet2$].库别 from [Sheet1$] right Join [sheet2$] on [Sheet1$].类别=[sheet2$].类别"

但如果想实现无论是哪个表格有,都显示出来,只有FULL JOIN可实现,但VBA不支持......

下一节是综合实例了,SQL还有两节课,整个VBA教学还有7节课就结束啦!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有